package com.ytjj.common.service;


import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

public interface RedisService {

    Boolean hasKey(String key);

    /**
     * 存储数据
     * @param key
     * @param value
     */
    void set(String key, String value);

    /**
     * 存储数据 并且设置过期时间
     * @param key
     * @param value
     * @param expire 单位秒
     */
    void set(String key, String value, long expire);

    /**
     * 获取key的过期时间
     */
    long getExpire(String key);

    /**
     * 获取数据
     */
    String get(String key);



    /**
     * 设置超期时间
     */
    boolean expire(String key, long expire);

    /**
     * 删除数据
     */
    void remove(String key);

    /**
     * 自增操作
     * @param delta 自增步长
     */
    Long increment(String key, long delta);


    /**
     * 在变量左边添加元素值
     *
     * @param key
     * @param value
     * @return
     */
    void leftPush(String key, Object value);

    /**
     * 获取集合指定位置的值。
     *
     * @param key
     * @param index
     * @return
     */
    public Object index(String key, long index);

    /**
     * 获取指定区间的值。
     *
     * @param key
     * @param start
     * @param end
     * @return
     */
    List<Object> range(String key, long start, long end);

    /**
     * 把最后一个参数值放到指定集合的第一个出现中间参数的前面，
     * 如果中间参数值存在的话。
     *
     * @param key
     * @param pivot
     * @param value
     * @return
     */
    void leftPush(String key, String pivot, String value);

    /**
     * 向左边批量添加参数元素。
     *
     * @param key
     * @param values
     * @return
     */
    void leftPushAll(String key, String... values);

    /**
     * 向集合最右边添加元素。
     *
     * @param key
     * @param value
     * @return
     */
    void leftPushAll(String key, String value);

    /**
     * 以集合方式向右边添加元素。
     *
     * @param key
     * @param values
     * @return
     */
    void rightPushAll(String key, List values);


    /**
     * 向左边批量添加参数元素。
     *
     * @param key
     * @param values
     * @return
     */
    void rightPushAll(String key, String... values);


    void rightPush(String key, String value);

    /**
     * 向已存在的集合中添加元素。
     *
     * @param key
     * @param value
     * @return
     */
    void rightPushIfPresent(String key, Object value);

    /**
     * 获取List长度
     *
     * @param key
     * @return
     */
    long listLength(String key);

    /**
     * 移除集合中的左边第一个元素。
     *
     * @param key
     * @return
     */
    void leftPop(String key);

    /**
     * 移除集合中左边的元素在等待的时间里，如果超过等待的时间仍没有元素则退出。
     *
     * @param key
     * @return
     */
    void leftPop(String key, long timeout, TimeUnit unit);

    /**
     * 移除集合中右边的元素。
     *
     * @param key
     * @return
     */
    void rightPop(String key);

    /**
     * 移除集合中右边的元素在等待的时间里，如果超过等待的时间仍没有元素则退出。
     *
     * @param key
     * @return
     */
    void rightPop(String key, long timeout, TimeUnit unit);

    /**
     * 删除集合
     *
     * @param key
     */
    void delete(String key);

    /**
     * 加入缓存
     *
     * @param key 键
     * @param map 键
     * @return
     */
    void addAll(String key, Map<String, String> map);

    /**
     * 添加一条
     *
     * @param key
     * @param mapKey
     * @param value
     */
    void add(String key,String mapKey,String value);

    /**
     * 获取 key 下的 所有  hashkey 和 value
     *
     * @param key 键
     * @return
     */
    Map<Object, Object> getHashEntries(String key);

    /**
     * 验证指定 key 下 有没有指定的 hashkey
     *
     * @param key
     * @param hashKey
     * @return
     */
    boolean hashKey(String key, String hashKey);

    /**
     * 获取指定key的值string
     *
     * @param key  键
     * @param key2 键
     * @return
     */
    String getMapString(String key, String key2);

    /**
     * 获取指定的值Int
     *
     * @param key  键
     * @param key2 键
     * @return
     */
    Integer getMapInt(String key, String key2);

    /**
     * 弹出元素并删除
     *
     * @param key 键
     * @return
     */
    String popValue(String key);

    /**
     * 删除指定 hash 的 HashKey
     *
     * @param key
     * @param hashKeys
     * @return 删除成功的 数量
     */
    Long delete(String key, String... hashKeys);

    /**
     * 给指定 hash 的 hashkey 做增减操作
     *
     * @param key
     * @param hashKey
     * @param number
     * @return
     */
    Long increment(String key, String hashKey, long number);

    /**
     * 给指定 hash 的 hashkey 做增减操作
     *
     * @param key
     * @param hashKey
     * @param number
     * @return
     */
    Double increment(String key, String hashKey, Double number);

    /**
     * 获取 key 下的 所有 hashkey 字段
     *
     * @param key
     * @return
     */
    Set<Object> hashKeys(String key);

    /**
     * 获取指定 hash 下面的 键值对 数量
     *
     * @param key
     * @return
     */
    Long hashSize(String key);

    Set<Object> sGet(String key);

    boolean sHasKey(String key, Object value);

    long sSet(String key, Object... values);

    long sSetAndTime(String key, long time, Object... values);

    long sGetSetSize(String key);

    long setRemove(String key, Object... values);

    /**
     * 根据前缀获取所有的key
     * 例如：pro_*
     */
    Set<String> getListKey(String prefix);

    /**
     * 获取自增主键id
     * @param key
     * @return
     */
    Long getIncrementId(String key);
}
